package demo7;
/*
给你一个 32 位的有符号整数 x ，返回 x 中每位上的数字反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。

假设环境不允许存储 64 位整数（有符号或无符号）。

 */
public class Test {

    public static void main(String[] args) {

        System.out.println(reverse(-1463847425));

//        System.out.println(Integer.MAX_VALUE);
//        System.out.println(Integer.MIN_VALUE);
//        //int的可表示范围是[-2147483648,2147483647]
//        System.out.println(100%-21);//取余的运算，其结果的正负号，只与被除数有关

    }
    public static int reverse(int x) {
        int sum = 0;//该变量用来计算反序后的值
        int step = 1;//位数，此时指向个位
        int turn = 1;//循环的轮数
        boolean mark = x>0? true:false;//判断是正数还是负数，true为正数

        while(turn != 11 && (x/step)!=0){
            //while的循环条件是，x的位数还没到最后，所以没办法除尽，能除尽表示走到尽头了
            if(turn == 10){
                //第十轮，有可能溢出
                if(mark){
                    //正数
                    if (Integer.MAX_VALUE/10 - sum < 0){
                        //溢出
                        return 0 ;
                    }else if((Integer.MAX_VALUE/10 - sum == 0) && ((x/step)%10)>7){
                        //溢出
                        return 0 ;
                    }
                }else{
                    //负数
                    if (Integer.MIN_VALUE/10 - sum > 0){
                        //溢出
                        return 0 ;
                    }else if((Integer.MIN_VALUE/10 - sum == 0) && ((x/step)%10)<-8){
                        //溢出
                        return 0 ;
                    }
                }
                //没溢出
                sum = (sum*10) + ((x/step)%10);

            }else{
                //其余情况不会溢出
                sum = (sum*10) + ((x/step)%10);
            }
            step = step * 10;//进一位
            turn++;
        }
        //能走出这个循环的数，肯定没有溢出
        return sum;
    }
}